home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / SWAG9605.DDD / 0017_Printing a graphics screen.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-05-31  |  5.2 KB  |  218 lines

  1. {
  2. > > I've got some source (a unit) for printing a graphic screen on a HP and
  3. > > Epson compatibles. If youre printer can emulate these 2 printers than
  4. > > you can use this. There are maybe some other folks interested in the
  5. > > source. Just ask for it, i'll send it to you the other day (only in the
  6. > > week, not on weekends).
  7.  
  8. {----------------BEGIN OF PASCAL SOURCE---------------------------------}
  9.  
  10. UNIT GRPRINT;
  11.  
  12. INTERFACE
  13.  
  14. Uses CRT,DOS,GRAPH;
  15.  
  16. Type PrinterTypen = (HP,EPSON);
  17.  
  18. Const PrinterType: PrinterTypen = HP;
  19.  
  20. Var PRN: Text;
  21.  
  22. Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
  23. {;Procedure PrintScreen(BackColor,Resolution: Word); (translated)}
  24.  
  25. IMPLEMENTATION
  26.  
  27. Const ESC = #27;
  28.  
  29. Var   AKleur,Breedte,Hoogte: Word;
  30.       ViewPort: ViewportType;
  31.       Intro: String[10];
  32.  
  33. Function NulFunctie(Rec: TextRec): Integer; FAR;
  34. Begin
  35.   NulFunctie := 0;
  36. end;
  37.  
  38. Function UitVoerNaarPrinter(VAR Rec: TextRec): Integer; FAR;
  39. Var Regs: Registers;
  40.     Wijzer: Word;
  41.  
  42. Begin
  43.   With Rec do
  44.     Begin
  45.       Wijzer := 0;
  46.       Regs.AH := 16;
  47.       While (Wijzer < BufPos) and (Regs.AH and 16 = 16) do
  48.         Begin
  49.           Regs.AH := 0;
  50.           Regs.AL := Ord(BufPtr^[Wijzer]);
  51.           Regs.DX := UserData[1];
  52.           Intr($17,Regs);
  53.           INC(Wijzer);
  54.         end; { WHILE }
  55.       BufPos := 0;
  56.       If Regs.AH and 16 = 16 then
  57.          UitVoerNaarPrinter := 0
  58.       Else
  59.          If Regs.AH and 32 = 32 then
  60.             UitVoerNaarPrinter := 159
  61.          Else
  62.             UitVoerNaarPrinter := 160;
  63.     end; { WITH }
  64. end;
  65.  
  66. Procedure InitHP(DichtHeid: Integer);
  67. Const CursorPositie: String = '5';
  68. Var PuntenPerInch: String[3];
  69.  
  70.  Begin
  71.    Case DichtHeid of
  72.      1: PuntenPerInch := '75';
  73.      2: PuntenPerInch := '100';
  74.      3: PuntenPerInch := '150';
  75.      4: PuntenPerInch := '300';
  76.      Else PuntenPerInch := '100';
  77.    end; { CASE }
  78.    Write(PRN,ESC+'E');
  79.    Write(PRN,ESC+'*t'+PuntenPerInch+'R');
  80.    Write(PRN,ESC+'&a'+CursorPositie+'C');
  81.    Write(PRN,ESC+'*r1A');
  82.  end;
  83.  
  84.  Procedure InitEpson(DichtHeid: Integer);
  85.  Var RegelAfstand: String[10];
  86.  Begin
  87.    RegelAfstand := #27+'3'+#24;
  88.    Case DichtHeid of
  89.      1: Intro := #27+'K';
  90.      2: Intro := #27+'L';
  91.      3: Intro := #27+'Y';
  92.      4: Intro := #27+'Z';
  93.      Else Intro := #27+'L';
  94.    end; { CASE }
  95.    Write(PRN,RegelAfStand);
  96.  end;
  97.  
  98.  Procedure SluitHp;
  99.  Begin
  100.    Write(PRN,ESC+'*rB');
  101.    Write(PRN,ESC+'E');
  102.  end;
  103.  
  104.  Procedure SluitEpson;
  105.  Begin
  106.    Write(PRN,#12);
  107.    Write(PRN,#27+'@');
  108.  end;
  109.  
  110.  Procedure HPAfdruk(DichtHeid: Word);
  111.  Var RegelLengte: String[2];
  112.      i: Integer;
  113.  
  114.  Procedure PuntenLijn(Y: Word);
  115.  Var Regel: String;
  116.      Basis: Word;
  117.      BitNr,ByteNr,DataByte: Byte;
  118.      Kleur: Word;
  119.  
  120.  Begin
  121.    Regel := Intro;
  122.    For ByteNr := 0 to Breedte do
  123.      Begin
  124.        DataByte := 0;
  125.        Basis := 8 * ByteNr;
  126.        For BitNr := 0 to 7 do
  127.          Begin
  128.            Kleur := GetPixel(BitNr+Basis,Y);
  129.            If Kleur <> AKleur then
  130.               DataByte := DataByte + 128 SHR BitNr;
  131.          end; { FOR }
  132.        Regel := Regel + Chr(DataByte);
  133.      end; { FOR }
  134.    Write(PRN,Regel);
  135.  end;
  136.  
  137.  Begin { HPAfdruk }
  138.    GetViewSettings(ViewPort);
  139.    With ViewPort do
  140.      Begin
  141.        Breedte := (X2+1)-X1;
  142.        Hoogte := (Breedte-7) div 8;
  143.      end; { WITH }
  144.    Str(Breedte+1,RegelLengte);
  145.    Intro := ESC+'*b'+RegelLengte+'W';
  146.    InitHp(DichtHeid);
  147.    For i := 0 to Hoogte +1 do
  148.      PuntenLijn(i);
  149.    SluitHp;
  150.  end;
  151.  
  152.  Procedure EpAfdruk(DichtHeid: Word);
  153.  Var X,Y,YOfs: Integer;
  154.      BitGegevens,Bits: Byte;
  155.      Kleur: Byte;
  156.  
  157.  Begin
  158.    GetViewSettings(ViewPort);
  159.    With ViewPort do
  160.      Begin
  161.        Hoogte := Y2-Y1;
  162.        Breedte := X2+1-X1;
  163.      end; { WITH }
  164.    InitEpson(DichtHeid);
  165.    Y := 0;
  166.    While Y < Hoogte do
  167.      Begin
  168.        Write(PRN,Intro,Chr(Lo(Breedte)),Chr(Hi(Breedte)));
  169.        For X := 0 to Breedte - 1 do
  170.          Begin
  171.            BitGegevens := 0;
  172.            If Y + 7 <= Hoogte then
  173.               Bits := 7
  174.            Else
  175.               Bits := Hoogte - Y;
  176.            For YOfs := 0 to Bits do
  177.              Begin
  178.                Kleur := GetPixel(X,YOfs+Y);
  179.                If Kleur <> AKleur then
  180.                   BitGegevens := BitGegevens + 128 SHR YOfs;
  181.              end; { FOR }
  182.            Write(PRN,Chr(BitGegevens));
  183.          end; { FOR }
  184.        Writeln(PRN);
  185.        INC(Y,8);
  186.      end; { WHILE }
  187.    SluitEpson;
  188.  end;
  189.  
  190.  Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
  191.  Begin
  192.    AKleur := AchterGrondKleur;
  193.    CASE PrinterType of
  194.      HP:    HPAfdruk(DichtHeid);
  195.      EPSON: EpAfdruk(DichtHeid);
  196.    end; { CASE }
  197.  end;
  198.  
  199.  Begin { GrPrint }
  200.    With TextRec(PRN) do
  201.      Begin
  202.        Mode := FmOutPut;
  203.        BufSize := SizeOf(Buffer);
  204.        BufPtr := @Buffer;
  205.        BufPos := 0;
  206.        OpenFunc := @NulFunctie;
  207.        InOutFunc := @UitVoerNaarPrinter;
  208.        FlushFunc := @UitVoerNaarPrinter;
  209.        CloseFunc := @UitVoerNaarPrinter;
  210.        UserData[1] := 0;
  211.      end; { WITH }
  212.  end.
  213.  
  214.  ------------------END OF PASCAL SOURCE-----------------------------
  215.  
  216. First set PrinterType to HP or EPSON, then call 'DrukVenster' with the
  217. backgroundcolor and resolution. This routine prints the current viewport.
  218.